//力扣25. K 个一组翻转链表

  class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        int len = 0;
        ListNode cur = head;
        while(cur!=null){ // 计算整个链表的长度
            len++;
            cur = cur.next;
        }
        int time = len/k; // 计算需要翻转的次数
        if(time == 0){  // 翻转次数为0直接返回
            return head;
        }

        ListNode newN = new ListNode(-1); // 构建新链表
        ListNode temp = newN;
        while(time!=0){ // 翻转time次结束
            cur = head.next;
            head.next = null;
            int n = k-1; // 翻转k-1个指向('->'为一个指向)
            while(n!=0){ // 翻转核心代码
                ListNode curN = cur.next;
                cur.next = head;
                head = cur;
                cur = curN;
                n--;
            }
            temp.next = head; // 让新链表接入刚才翻转的链表
            head = cur; // 因为当前head为翻转后的链表的头结点，所以让head为之前链表的next(比如示例1给的例子:在第一次翻转后head为2,那么head=cur就可以让head为3了,以此类推)
            while(temp.next!=null){ // 让temp指向新链表的最后一个节点，以便接入每次翻转的链表
                temp = temp.next;
            }
            time--;
        }
        temp.next=head; // 记得接上最后没有翻转的链表(题目要求:如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。)
        return newN.next;
    }
}